
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>分库分表后的数据一致性如何保证 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>分库分表后的数据一致性如何保证 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">为什么分库分表会引入数据一致性的挑战，而在单体数据库中则不存在这个问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在单体数据库中，事务可以通过ACID（原子性、一致性、隔离性、持久性）来保障一致性。但在分库分表的环境中，数据被分散到多个物理库或表中，导致传统的事务隔离失效，跨库、跨表的事务操作需要特殊的分布式一致性技术来支持。</div>
          </div>
          <div class="card-source">来源: 分库分表后的数据一致性如何保证</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">概念</div>
          <div class="card-question">请解释强一致性场景和最终一致性场景的区别，并各举一个业务例子。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">概念</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">强一致性场景的业务操作原子性要求很高，不能容忍任何状态失误，例如金融系统中的转账操作。最终一致性场景则允许短暂的不一致性，只要数据最终能够达到一致即可，例如电商系统中的订单状态更新。</div>
          </div>
          <div class="card-source">来源: 需求分析 / 1. 业务模型的强一致性与最终一致性需求</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">TCC模式（Try-Confirm-Cancel）的三个阶段分别承担什么职责？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">TCC模式将操作分为三个阶段：Try阶段进行资源预留；Confirm阶段确认操作，完成业务；Cancel阶段则在发生错误或需要回滚时执行补偿操作，释放预留的资源。</div>
          </div>
          <div class="card-source">来源: 一致性实现方法 / 1. 分布式事务控制</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">在基于消息的最终一致性方案中，为什么保障操作的“幂等性”至关重要？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">因为在事件驱动模型中，订阅节点可能会因为网络问题或故障重试而重复消费消息。保障幂等性可以确保重复处理同一个消息不会影响最终的数据结果，从而避免因重复操作导致数据不一致。</div>
          </div>
          <div class="card-source">来源: 一致性实现方法 / 2. 基于消息的最终一致性</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">Raft算法是如何保证分布式系统中数据一致性的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Raft算法通过选举一个Leader节点并利用日志同步来保证一致性。Leader节点负责处理所有写请求，并将操作日志同步到其他Follower节点，从而确保所有节点上都有一致的操作序列。</div>
          </div>
          <div class="card-source">来源: 一致性实现方法 / 4. 一致性算法</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">什么是“Cache-Aside”模式？它如何帮助维护缓存与数据库的一致性？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Cache-Aside模式是一种缓存策略，其核心思想是：缓存仅在读取数据时加载（Cache Miss），而在写入数据时，直接更新数据库并清除（Invalidate）缓存中对应的条目。这确保了下次读取时能从数据库加载最新数据，从而保障缓存和数据库的一致性。</div>
          </div>
          <div class="card-source">来源: 基础设计思路 / 5. 缓存与数据一致性</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">在数据同步机制中，增量同步相比于全量同步有哪些优缺点？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">优点：增量同步只传输变更部分的数据，大大减少了网络和存储的占用，提高了同步效率，适合高并发和大规模数据场景。缺点：其准确性依赖于变更日志的可靠性，并且在需要时数据恢复过程较为复杂。</div>
          </div>
          <div class="card-source">来源: 数据同步与重试机制 / 1、数据同步机制</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">什么是“指数退避重试”策略？它为什么能避免对系统造成冲击？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">指数退避重试是一种重试策略，其重试的时间间隔会随着重试次数的增加而呈指数倍递增。这种方式可以避免因瞬时故障导致的大量请求在短时间内密集重试，给下游系统或网络留出恢复时间，从而避免冲击。</div>
          </div>
          <div class="card-source">来源: 数据同步与重试机制 / 2、重试机制</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">请解释“读己之写一致性”（Read-your-writes consistency）模型。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">“读己之写一致性”模型保证用户在写入数据后，能立即读取到自己刚刚写入的内容。而其他用户可能因为数据同步延迟，暂时无法读取到这个新内容。这种模型主要用于提升单用户的操作体验，例如更新个人设置后能立刻看到效果。</div>
          </div>
          <div class="card-source">来源: 读写一致性管理 / 1、读写一致性的分类</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
